package com.iamteer.day19;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.junit.Test;

public class App {

	//1. 对 javabean 的基本操作
	@Test
	public void test1() throws Exception {
		//a. 基本操作
		Admin admin = new Admin();
//		admin.setUserName("Jack");
//		admin.setPwd("888");
		
		//b. BeanUtils 组件实现对象属性的拷贝
		BeanUtils.copyProperty(admin, "userName", "Jack");
		BeanUtils.setProperty(admin, "age", 18);//对于基本类型，会自动进行转换
		
		//测试——成功
//		System.out.println(admin.getUserName());
//		System.out.println(admin.getAge());
		
		//c. 对象的拷贝
		Admin newAdmin = new Admin();
		BeanUtils.copyProperties(newAdmin, admin);
		
		//测试——成功
//		System.out.println(newAdmin.getUserName());
//		System.out.println(newAdmin.getAge());
		
		//d. map 数据，拷贝到对象中
		Admin adminMap = new Admin();
		HashMap<String, Object> map = new HashMap<String,Object>();
		map.put("userName", "Jerry");
		map.put("age", 28);
		//注意：map 中的 key 要与 javabean 的属性名一致
		BeanUtils.populate(adminMap, map);
		//测试——成功
		System.out.println(adminMap.getUserName());
		System.out.println(adminMap.getAge());
	}
	
	//2. 日期类型转换器
	@Test
	public void test2() throws Exception {
		//模拟表单
		String name = "jack";
		String age = "20";
		String birth = "1999-09-09";
		
		//对象
		Admin admin = new Admin();
		
		// 注册日期类型转换器：
		//1. 自定义的方式
		ConvertUtils.register(new Converter() {
			
			@Override
			public Object convert(Class arg0, Object arg1) {
				if (arg0 != Date.class) {
					return null;
				}
				if (arg1 == null || "".equals(arg1.toString().trim())) {
					return null;
				}
				
				try {
					// 字符串转换为日期
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
					return sdf.parse(arg1.toString());
				} catch (ParseException e) {
					throw new RuntimeException(e);
				}
			}
		}, Date.class);
		
		//把表单提交的数据，封装到对象中
		BeanUtils.copyProperty(admin, "userName", name);
		BeanUtils.copyProperty(admin, "age", age);
		BeanUtils.copyProperty(admin, "birth", birth);
		
		//测试
		System.out.println(admin);
	}
	
	//3. 使用提供的日期类型转换工具类
	@Test
	public void test3() throws Exception {
		//模拟表单
		String name = "jack";
		String age = "20";
		String birth = "1999-09-09";//null可以，但""不行，注意测试
		
		//对象
		Admin admin = new Admin();
		
		// 注册日期类型转换器：
		//2.  使用组件提供的转换器工具类
		ConvertUtils.register(new DateLocaleConverter(), Date.class);

		
		//把表单提交的数据，封装到对象中
		BeanUtils.copyProperty(admin, "userName", name);
		BeanUtils.copyProperty(admin, "age", age);
		BeanUtils.copyProperty(admin, "birth", birth);
		
		//测试
		System.out.println(admin);
	}
}
